package cn.bonoon.kernel.web.annotations.components;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import cn.bonoon.kernel.annotations.QueryExpression;

/**
 * <pre>
 * 可以在自动生成的选择列表<code>ComboGrid</code>使用查找条件来过滤数据
 * 
 * 可以使用{@link cn.bonoon.kernel.web.annotations.AutoDataLoader AutoDataLoader}来自动加载数据
 * 如果使用了自动加载数据，则<code>value</code>属性不需要指定值，该值无效
 * <font color='red'>
 * 本注解使用{@link cn.bonoon.kernel.web.annotations.AutoDataLoader AutoDataLoader}时必须使用{@link cn.bonoon.kernel.web.annotations.AutoDataResultClass AutoDataResultClass}，否则有异常
 * </font>
 * 指定列表的数据结构，使用{@link cn.bonoon.kernel.web.annotations.AutoDataResultClass AutoDataResultClass}
 * 如果使用{@link cn.bonoon.kernel.web.annotations.AutoDataResultClass AutoDataResultClass}的结构对象的字段上使用了
 * {@link ComboGridColumn}来指定，则会自动根据该字段的指定来生成combogrid的colunm项
 * {@link cn.bonoon.kernel.web.annotations.AutoDataResultClass AutoDataResultClass}的{@link ComboGridColumn}可与
 * {@link #columns()}同时使用，即：如果没有在实体上使用{@link ComboGridColumn}指定的字段，
 * 可以使用{@link #columns()}进行指定，如果两边同时指向同一字段的，两个指定都会同时显示
 * <hr/>
 * 如果需要支持多选，可以通过{@link ComboMultipleChecker}注解来指定；默认的情况下
 * 如果被注解的该字段为数组，则认为是支持多先，否则是单选
 * </pre>
 * @author jackson
 *
 */
@Target(FIELD)
@Retention(RUNTIME)
public @interface AsComboGrid {

	/**
	 * <pre>
	 * url
	 * 使用{@link cn.bonoon.kernel.web.annotations.AutoDataLoader AutoDataLoader}，则该指定无效
	 * <hr/>
	 * 如果是自己指定的URL则需要自己指定项目名，即：{@link javax.servlet.ServletContext#getContextPath() ServletContext.getContextPath()}
	 * 因为自动生成的处理器的路径是会自己加上{@link javax.servlet.ServletContext#getContextPath() ServletContext.getContextPath()}信息的
	 * </pre>
	 * @return
	 */
	String value() default "";

	/**
	 * <pre>
	 * 指定combogrid显示的列
	 * </pre>
	 * @return
	 */
	ComboGridColumn[] columns() default {};

	String idField() default "id";

	String textField() default "text";

	boolean rownumbers() default false;
	
	boolean pagination() default true;

	int pageSize() default 10;

	String pageList() default "";

	String sortName() default "createAt";

	String sortOrder() default "asc";
	
	int panelWidth() default 400;
	
	OnReload[] reload() default {};
	
	/**
	 * <pre>
	 * 指定必须以SOPTION开头
	 * </pre>
	 * @return
	 */
	QueryExpression[] searchs() default {};
	
	Class<?> queryClass() default Object.class;
}
